/**
 * Description:
 * Created by Administrator on 2016/10/31.
 */
//arguments object
function l(msg) {
    console.log(msg);
}
function printArgs() {
    // l(arguments);
    var a = Array.prototype.slice.call(arguments);
    // l(Array.isArray(a));
    // l(a);
}
printArgs("A", "a", 0, {
    foo: 'hello'
});
/*
 *
 * ["A", "a", 0, Object]
 * 0: "A"
 * 1: "a"
 * 2: 0
 * 3: Object
 * callee: printArgs()
 * length: 4
 * Symbol(Symbol.iterator): values()
 * __proto__: Object
 deno2.js:7 true
 deno2.js:7 ["A", "a", 0, Object]
 0: "A"
 1: "a"
 2: 0
 3: Object
 length: 4
 __proto__: Array[0]
 */
/*首先，slice 方法得到的结果是一个数组，参数便是 arguments。事实上，满足一定条件的对象都能被 slice 方法转换成数组。看个例子：

 const obj = { 0: "A", 1: "B", length: 2 };
 const result = [].slice.call(obj);
 console.log(Array.isArray(result), result);
 执行结果是：

 true ["A", "B"]
 从上面例子可以看出，条件就是： 1) 属性为 0，1，2…；2） 具有 length 属性；*/
const obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3
};
var arr = [].slice.call(obj);
// l(arr);
// l(Array.isArray(arr))
//将arguments暴露出去
function getArgs() {
    const args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
        args[i] = arguments[i];
    }
    return args;
}
// l(getArgs());
//将参数从一个函数传递到另一个函数的推荐做法。
function foo() {
    bar.apply(this, arguments)
    l(arguments[0])
}
foo(1, 2, 3);
function bar(a, b, c) {
    l(a + b + c);
}